// 导入必要的包和类
package com.example.emos.wx.aop;

import com.example.emos.wx.common.util.R;
import com.example.emos.wx.config.shiro.ThreadLocalToken;
import org.aspectj.lang.ProceedingJoinPoint;
import org.aspectj.lang.annotation.Around;
import org.aspectj.lang.annotation.Aspect;
import org.aspectj.lang.annotation.Pointcut;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;

// 定义切面，用于处理Token的切面逻辑
@Aspect
@Component
public class TokenAspect {

    // 自动注入ThreadLocalToken实例，用于在线程本地存储令牌
    @Autowired
    private ThreadLocalToken threadLocalToken;

    // 定义切点，匹配所有com.example.emos.wx.controller包下的public方法
    @Pointcut("execution(public * com.example.emos.wx.controller.*.*(..))")
    public void aspect() {
        // 切点方法体为空，该方法只是一个标识
    }

    // 环绕通知，用于在目标方法执行前后进行处理
    @Around("aspect()")
    public Object around(ProceedingJoinPoint point) throws Throwable {
        // 执行目标方法，并获取返回结果
        R r = (R) point.proceed();

        // 从ThreadLocal中获取令牌
        String token = threadLocalToken.getToken();

        // 如果令牌不为null，则将令牌放入返回结果中，并清除ThreadLocal中的令牌
        if (token != null) {
            r.put("token", token);
            threadLocalToken.clear();
        }

        // 返回处理后的结果
        return r;
    }
}
